package log

import (
	"io"
	"log"
	"os"
)

// Logger 接口定义了处理日志的基础方法
type Logger interface {
	SetOutput(w io.Writer)                  // 设置输出接口
	Output(calldepth int, s string) error   // 输出日志，calldepth 为文件深度，s 为日志内容
	Printf(format string, v ...interface{}) // 输出带格式的日志
	Print(v ...interface{})                 // 打印日志
	Println(v ...interface{})               // 打印日志并换行
	Flags() int                             // 获取日志标签
	SetFlags(flag int)                      // 设置日志标签，输出日志时根据标签会获得不同的运行信息
	Prefix() string                         // 获得日志前缀
	SetPrefix(prefix string)                // 设置日志前缀
	Writer() io.Writer                      // 获得输出接口
}

var (
	Init      Logger = log.New(os.Stdout, " ", log.LstdFlags)                          // 用于程序初始化时保存一些重要信息
	Info      Logger = log.New(os.Stdout, "[INFO] ", log.LstdFlags)                    // 信息类型日志
	Warning   Logger = log.New(os.Stderr, "[WARNING] ", log.LstdFlags|log.Llongfile)   // 警号类日志
	Danger    Logger = log.New(os.Stderr, "[DANGER] ", log.LstdFlags|log.Llongfile)    // 危险类日志
	Error     Logger = log.New(os.Stderr, "[ERROR] ", log.LstdFlags|log.Llongfile)     // 错误类日志
	Emergency Logger = log.New(os.Stderr, "[EMERGENCY] ", log.LstdFlags|log.Llongfile) // 紧急类日志
	Panic     Logger = log.New(os.Stderr, "[PANIC] ", log.LstdFlags|log.Llongfile)     // 用于记录 panic 信息, 并非触发 panic
)

// 设置日志输出接口
func SetOutput(w io.Writer, logger ...Logger) {
	for _, l := range logger {
		l.SetOutput(w)
	}
}

// 设置日志输出标签
func SetFlags(flags int, logger ...Logger) {
	for _, l := range logger {
		l.SetFlags(flags)
	}
}
